知识点名称:服务的生命周期
编号: K6-2
前驱知识点编号:K6-1,K3-4
作者:刘凤华
讲义内容:
6.1.2服务的生命周期
与其他组件不同的是,Service不能自己主动运行,需要调用相应的方法来启动。启动服务的方法有两个:start启动和bind启动,调用的方法是Context.startService()和Context.bindService()。使用不同的方法启动服务,服务的生命周期也会不同,接下来我们结合不同的启动方式与它的生命周期图来看不同方式下服务的生命周期过程转化。
start启动的服务的生命周期:如果一个Service被某个Activity调用Context.startService方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行。如果一个Service被startService方法多次启动,那么onCreate方法只会调用一次,onStart将会被调用多次(对应调用startService的次数),并且系统只会创建Service的一个实例。该Service将会一直在后台运行,而不管对应程序的Activity是否在运行,直到被调用stopService方法停止服务,多次启动的服务都会被停止,或某次启动的服务调用自身的stopSelf方法停止该次服务。当然如果系统资源不足,Android系统也可能结束服务。
bind方式启动的服务的生命周期:如果一个Service被某个Activity调用Context.bindService方法绑定启动,不管调用bindService调用几次,onCreate方法都只会调用一次,同时onStart方法始终不会被调用。当连接建立之后,Service将会一直运行,除非调用Context.unbindService断开连接或者之前调用bindService的Context不存在了(如Activity被finish的时候),系统将会自动停止Service,对应onDestroy将被调用。这里有关绑定服务的连接后面会详细讲解。
3.被start启动又被绑定的服务的生命周期:如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。调用unbindService将不会停止Service,而必须调用stopService或Service的stopSelf来停止服务。
4.当服务被停止时清除服务:当一个Service被终止,可以通过调用下面的方法:
(1)、调用stopService;
(2)、调用stopSelf;
(3)、不再有绑定的连接(没有被启动))时,onDestroy方法将会被调用,这时就可以做一些清除工作,如停止在Service中创建并运行的线程。